home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 28.1 KB | 1,323 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBit.c
- //
- // By Christofer Åkersten <chris@basesoft.se>
- //
- // Ideas and code snippets from
- // Tony Myles, Ben Sharpe, Brigham Stevens, Sean Callahan, and Joe Britt
- //
- // Description: Implementation of a depth-independent BlitPixie for 68k Macs only.
- //
- // Somewhat modified by Anders F Björklund to match other blitters re: param order
- ///--------------------------------------------------------------------------------------
-
- #ifndef __BLITPIXIE__
- #include "BlitPixieHeader.h"
- #endif
-
- #include "BlitPixieAsm.h"
-
- // generic all-bit routine:
- //void BlitPixieAllBit(
- // unsigned char *srcPixelP, start of first pixel (aligned left to longword boundary)
- // unsigned char *dstPixelP,
- // unsigned long srcRowStride, offset from end of line to start of next row
- // unsigned long dstRowStride,
- // unsigned long numBytesPerRow, number of bytes per row, always a multiple of four
- // unsigned long rowsToCopy, number of rows
- // unsigned long srcExtraStart, bit offset to start at, before longs (maximum 31 bits)
- // unsigned long dstExtraStart,
- // unsigned long dstExtraEnd); bits to copy/shift after longs
-
- #pragma mark *** 680X0:
- #if USE_68K_ASSEMBLY
-
- #define UNROLL(start, end) \
- move.l d1, d0; \
- lsr.l ASM_NUM(4), d1; \
- moveq ASM_NUM(0x0F), d2; \
- and.l d2, d0; \
- \
- lea end, a0; \
- lea start, a1; \
- sub.l a0, a1; \
- move.l a1, d2; \
- asr.l ASM_NUM(4), d2; \
- mulu.l d2, d0; \
- add.l d0, a0;
-
- #define REPEAT(instr) \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr;
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitRect
- ///--------------------------------------------------------------------------------------
-
- ASM_FUNC void BlitPixieAllBitRect(
- register unsigned char *srcPixelP,
- register unsigned char *dstPixelP,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- unsigned long numBytesPerRow,
- unsigned long rowsToCopy,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
-
- ASM_BEGIN
-
- move.l numBytesPerRow, d1
- lsr.l ASM_NUM(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, srcExtraStart
- bfins srcExtraStart, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- move.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- move.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
- bfins dstExtraStart, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraEnd; \
- bfins dstExtraEnd, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- @OOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- bfins d2, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
- bfins d2, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OOE_RowLoop
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- move.l rowsToCopy, d2
- @VN_RowLoop:
- // BLIT
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- ASM_END
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitMask
- ///--------------------------------------------------------------------------------------
-
- ASM_FUNC void BlitPixieAllBitMask(
- register unsigned char *srcPixelP,
- register unsigned char *dstPixelP,
- register unsigned char *maskPixelP,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- unsigned long numBytesPerRow,
- unsigned long rowsToCopy,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
-
- ASM_BEGIN
-
- move.l numBytesPerRow, d1
- lsr.l ASM_NUM(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (dstPixelP), dstExtraEnd; \
- and.l (maskPixelP)+, dstExtraEnd; \
- or.l (srcPixelP)+, dstExtraEnd; \
- move.l dstExtraEnd, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (dstPixelP), srcExtraStart; \
- and.l (maskPixelP)+, srcExtraStart; \
- or.l (srcPixelP)+, srcExtraStart; \
- move.l srcExtraStart, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStart
- bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStart
- and.l dstExtraStart, srcExtraStart
- bfextu (srcPixelP){0:dstExtraEnd}, dstExtraStart
- or.l dstExtraStart, srcExtraStart
- bfins srcExtraStart, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStart; \
- and.l (maskPixelP)+, srcExtraStart; \
- or.l (srcPixelP)+, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStart; \
- and.l (maskPixelP)+, srcExtraStart; \
- or.l (srcPixelP)+, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStart
- bfextu (maskPixelP){0:dstExtraEnd}, d0
- and.l d0, srcExtraStart
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- or.l d0, srcExtraStart
- bfins srcExtraStart, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraStart; \
- and.l dstExtraStart, (dstPixelP); \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- or.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraStart; \
- and.l dstExtraStart, (dstPixelP); \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- or.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){0:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
- and.l dstExtraStart, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
- or.l dstExtraStart, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- @OO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, dstExtraEnd; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, dstExtraEnd; \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- or.l d2, dstExtraEnd; \
- bfins dstExtraEnd, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- move.l d1, numBytesPerRow
- @OOE_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, d1; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, d1; \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- or.l d2, d1; \
- bfins d1, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
- or.l d2, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OOE_RowLoop
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- move.l rowsToCopy, d2
- @VN_RowLoop:
- // BLIT
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d1
- and.l d1, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d1
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- ASM_END
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitPartialMask
- ///--------------------------------------------------------------------------------------
-
- ASM_FUNC void BlitPixieAllBitPartialMask(
- register unsigned char *srcPixelP,
- register unsigned char *dstPixelP,
- register unsigned char *maskPixelP,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- unsigned long numBytesPerRow,
- unsigned long rowsToCopy,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
-
- ASM_BEGIN
-
- move.l numBytesPerRow, d1
- lsr.l ASM_NUM(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l ASM_NUM(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- move.l dstExtraStart, d0
- lsr.l ASM_NUM(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, dstExtraEnd; \
- and.l dstExtraEnd, (dstPixelP); \
- not.l dstExtraEnd; \
- and.l (srcPixelP)+, dstExtraEnd; \
- or.l dstExtraEnd, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, srcExtraStart; \
- and.l srcExtraStart, (dstPixelP); \
- not.l srcExtraStart; \
- and.l (srcPixelP)+, srcExtraStart; \
- or.l srcExtraStart, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStart
- bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStart
- and.l dstExtraStart, srcExtraStart
- not.l dstExtraStart
- and.l dstExtraStart, d0
- or.l srcExtraStart, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, dstExtraEnd; \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStart; \
- and.l dstExtraEnd, srcExtraStart; \
- not.l dstExtraEnd; \
- and.l (srcPixelP)+, dstExtraEnd; \
- or.l dstExtraEnd, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- // move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, d2; \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStart; \
- and.l d2, srcExtraStart; \
- not.l d2; \
- and.l (srcPixelP)+, d2; \
- or.l d2, srcExtraStart; \
- bfins srcExtraStart, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStart
- bfextu (maskPixelP){0:dstExtraEnd}, d2
- and.l d2, srcExtraStart
- not.l d2
- and.l d2, d0
- or.l srcExtraStart, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraEnd; \
- and.l dstExtraEnd, (dstPixelP); \
- not.l dstExtraEnd; \
- and.l dstExtraEnd, dstExtraStart; \
- or.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStart; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, (dstPixelP); \
- not.l d2; \
- and.l d2, dstExtraStart; \
- or.l dstExtraStart, (dstPixelP)+; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){0:dstExtraEnd}, dstExtraStart
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, dstExtraStart
- not.l d2
- and.l d2, d0
- or.l dstExtraStart, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- move.l d1, numBytesPerRow
- @OO_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, d1; \
- bfextu (dstPixelP){dstExtraStart:0}, dstExtraEnd; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, dstExtraEnd; \
- not.l d2; \
- and.l d2, d1; \
- or.l dstExtraEnd, d1; \
- bfins d1, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- move.l d1, numBytesPerRow
- move.l dstRowStride, -(sp)
- @OOE_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstRowStride; \
- bfextu (dstPixelP){dstExtraStart:0}, d1; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, d1; \
- not.l d2; \
- and.l d2, dstRowStride; \
- or.l d1, dstRowStride; \
- bfins dstRowStride, (dstPixelP){dstExtraStart:0}; \
- addq.l ASM_NUM(4), srcPixelP; \
- addq.l ASM_NUM(4), dstPixelP; \
- addq.l ASM_NUM(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l ASM_NUM(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d1
- not.l d2
- and.l d2, d0
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l (sp), dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @OOE_RowLoop
-
- addq.l ASM_NUM(4), sp
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- @VN_RowLoop:
- // BLIT
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d1
- not.l d2
- and.l d2, d0
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l ASM_NUM(1), rowsToCopy
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- ASM_END
- }
-
- #endif /* GENERATING68K */